/**
 * Created with JetBrains PhpStorm.
 * User: CEL.L
 * Date: 4/26/12
 * Time: 9:36 PM
 * To change this template use File | Settings | File Templates.
 */
;(function($) {
    DT.Box = function(options) {
        var _this = this;

        this.defaults = {
            type    : 'box',
            width   : 150,
            height  : 70,
            left    : 'center',
            top     : 'center',
            desktop : null
        };

        this.handler = {
            box    : null,
            marker : null,
            work   : null
        };

        this._ini = function(o) {
            options = $.extend(_this.defaults, o);

            return this;
        };

        // 创建box
        this._createFrame = function() {
            var handler = _this.handler;


            handler.box = $('<div></div>').addClass('dt-box')
                .appendTo(options.desktop)
                .click(function() { DT.taskbarInstance.activate(options.guid); });

            handler.work = $('<div></div>').addClass('dt-box-work')
                .appendTo(handler.box);

            return this;
        };

        // 设置元素的大小与位置
        this._setSize = function() {
            var handler = _this.handler;

            handler.box.css({
                width  : options.width,
                height : options.height,
                zIndex : DT.BoxDeep
            });
            handler.box.data('zIndex', DT.BoxDeep++);

            if (options.left.toString().toLowerCase() == 'center') {
                handler.box.css({
                    left       : '50%',
                    marginLeft : '-' + (handler.box.width() / 2) + 'px'
                });
            } else {
                handler.box.css({
                    left : options.left,
                    marginLeft : 0
                });
            }

            if (options.top.toString().toLowerCase() == 'center') {
                handler.box.css({
                    top       : '50%',
                    marginTop : '-' + (handler.box.height() / 2 + DT.TASKBAR_HEIGHT) + 'px'
                });
            } else {
                handler.box.css({
                    top : options.top,
                    marginTop : 0
                });
            }

            // 当高度是100%是要修复，因为在桌面中要减去taskbar的高度。
            if (options.height == '100%') {
                handler.box.css({
                    height : (options.desktop.height - DT.TASKBAR_HEIGHT) + 'px'
                })
            } else {
                handler.box.css({
                    height : options.height
                })
            }

            handler.work.css({
                width : options.width,
                height : options.height
            });

            return this;
        };

        /**
         * 初始化最大化窗口参数
         */
        this._maxParam = function() {
            var defaults = _this.defaults;

            // 临时位置信息变量不为空则为最大化后
            if (defaults.tPosition) {
                var tp = defaults.tPosition;

                defaults.left      =  tp.left;
                defaults.top       = tp.top;
                defaults.width     = tp.width;
                defaults.height    = tp.height;

                defaults.tPosition = null;
            } else {
                defaults.tPosition = {
                    left   : defaults.left,
                    top    : defaults.top,
                    width  : defaults.width,
                    height : defaults.height
                };

                defaults.left   = 0;
                defaults.top    = 0;
                defaults.width  = defaults.desktop.width() - 10;
                defaults.height = defaults.desktop.height() - DT.TASKBAR_HEIGHT - 10;
            }

            return this;
        };

        /**
         * 最小化窗口，即隐藏
         * @param {Function} fn 最小化后需要执行的回调函数
          */
        this._minHandler = function(fn) {
            var handler = _this.handler;

            handler.box.fadeOut('fast', 'linear', fn);

            var taskbar = DT.moduleManager.getHandler(options.guid, 'taskbar');

            if (taskbar) {
                taskbar.deactivate(options.guid);
            }

            return this;
        };

        /**
         * 关闭窗口
         * @param {Function} fn 窗口关闭后执行的回调函数
         */
        this._closeHandler = function(fn) {
            // 先最小化窗口，然后再删除元素。
            this._minHandler(function() {
                var handler = _this.handler;

                handler.work = null;
                handler.box  = null;

                var taskbar = DT.moduleManager.getHandler(options.guid, 'taskbar');

                if (taskbar) {
                    taskbar.delIcon(options.guid);
                    DT.moduleManager.setHandler(options.guid, 'taskbar', null);
                }

                $.type(fn) == 'function' && fn();

                DT.moduleManager.remove(options.guid);
            });

            return this;
        };

        /**
         * 显示窗口
         * @param {Function} fn 显示后需要执行的回调函数
         */
        this._show = function(fn) {
            var handler = _this.handler;

            handler.box.fadeIn('fast', 'linear', fn);

            return this;
        };

        // 设置box的内容
        this._setContent = function(content) {
            var handler = _this.handler,
                work    = handler.work;

            if ($.type(content) == 'object') {
                work.append(content);
            } else {
                work.html(content);
            }
            return this;
        };

        // 将窗口的显示到最前，即置顶
        this._setTop = function() {
            _this.handler.box.css({ zIndex : DT.BOX_MAX_DEEP});

            return this;
        };

        // 还原窗口的深度
        this._restoreDeep = function() {
            var box =  _this.handler.box;
            console.log(box);
            box.css({ zIndex : box.data('zIndex') });

            return this;
        }

        this._ini(options);
   };

    DT.Box.prototype = {
        /**
         * 渲染Box
         * @param {String|DOM} content 用来渲染的内容，可以是html字符串或dom对象。
         */
        render : function(content /* String|DOM */) {
            this._createFrame()._setContent(content)._setSize().top();
            return this;
        },

        /**
         * 设置窗口内容
         * @param content 要设置的内容，可以是字符串，也可以为DOM对象。
         * @return {*}
         */
        setContent : function(content) {
            this._setContent(content);

            return this;
        },

        /**
         * 最小化窗口
         * @param {Function} fn 窗口最小化后执行的回调函数
         */
        min : function(fn /* Function */) {
            this._minHandler(fn);

            return this;
        },

        /**
         * 最大化窗口
         * @param {Function} fn 窗口最大化后执行的回调函数
         */
        max : function(fn /* Function */) {
            this._maxParam()._setSize();

            $.type(fn) == 'function' && fn();

            return this;
        },

        /**
         * 关闭窗口
         * @param {Function} fn 窗口关闭后执行的回调函数
         */
        close : function(fn /* Function */) {
            this._closeHandler(fn);

            return this;
        },

        /**
         * 显示窗口
         * @param {Function} fn 窗口显示后执行的回调函数
         */
        show : function(fn /* Function */) {
            this._show(fn);

            return this;
        },

        /**
         * 显示/隐藏窗口，交互执行
         * @param {Function} fn 窗口显示后执行的回调函数
         */
        toggle : function(fn /* Function */) {
            this.handler.box.toggle('fast', 'linear', fn);

            return this;
        },

        // 置顶窗口
        top : function() {
            var defaults = this.defaults,
                guid     = defaults.guid,
                box      = this.handler.box;


            $.each(
                DT.moduleManager.getCache(),
                function(index, item) {
                    if (item.guid != guid) {
                        item[defaults.type] && item[defaults.type].restoreDeep();

                        DT.taskbarInstance.deactivate(item.guid);
                        item.isTop = false;
                    } else {
                        item[defaults.type] && item[defaults.type]._setTop();
                        DT.taskbarInstance.activate(item.guid);
                        item.isTop = true;
                    }
                });

            return this;
        },

        // 还原窗口的深度
        restoreDeep : function() {
            this._restoreDeep();
            return this;
        }
    };
    DT.Box.prototype.constructor = DT.Box;
})(jQuery);